using dnAnalytics.Math;
using NUnit.Framework;

namespace dnAnalytics.Tests.Math
{
    [TestFixture]
    public class ComplexMath_TanhTest
    {
        [Test]
        public void Tanh()
        {
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(0.0, 1.19209289550780998537e-7)), new Complex(0.0, 1.19209289550781563226e-7), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(0.0, -1.19209289550780998537e-7)), new Complex(0.0, -1.19209289550781563226e-7), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(0.0, 5.0e-1)), new Complex(0.0, 5.46302489843790513255e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(0.0, -5.0e-1)), new Complex(0.0, -5.46302489843790513255e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(0.0, 1.0)), new Complex(0.0, 1.55740772465490223051), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(0.0, -1.0)), new Complex(0.0, -1.55740772465490223051), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(0.0, 2.0)), new Complex(0.0, -2.18503986326151899164), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(0.0, -2.0)), new Complex(0.0, 2.18503986326151899164), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(0.0, 8.388608e6)), new Complex(0.0, -4.79341238626542857159e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(0.0, -8.388608e6)), new Complex(0.0, 4.79341238626542857159e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(1.19209289550780998537e-7, 0.0)), new Complex(1.19209289550780433848e-7, 0.0), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-1.19209289550780998537e-7, 0.0)), new Complex(-1.19209289550780433848e-7, 0.0), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(1.19209289550780998537e-7, 1.19209289550780998537e-7)), new Complex(1.19209289550782127914e-7, 1.1920928955077986916e-7), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(1.19209289550780998537e-7, -1.19209289550780998537e-7)), new Complex(1.19209289550782127914e-7, -1.1920928955077986916e-7), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-1.19209289550780998537e-7, 1.19209289550780998537e-7)), new Complex(-1.19209289550782127914e-7, 1.1920928955077986916e-7), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-1.19209289550780998537e-7, -1.19209289550780998537e-7)), new Complex(-1.19209289550782127914e-7, -1.1920928955077986916e-7), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(1.19209289550780998537e-7, 5.0e-1)), new Complex(1.54786874104679875408e-7, 5.46302489843780432863e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(1.19209289550780998537e-7, -5.0e-1)), new Complex(1.54786874104679875408e-7, -5.46302489843780432863e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-1.19209289550780998537e-7, 5.0e-1)), new Complex(-1.54786874104679875408e-7, 5.46302489843780432863e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-1.19209289550780998537e-7, -5.0e-1)), new Complex(-1.54786874104679875408e-7, -5.46302489843780432863e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(1.19209289550780998537e-7, 1.0)), new Complex(4.08353664972140578674e-7, 1.5574077246548264166), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(1.19209289550780998537e-7, -1.0)), new Complex(4.08353664972140578674e-7, -1.5574077246548264166), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-1.19209289550780998537e-7, 1.0)), new Complex(-4.08353664972140578674e-7, 1.5574077246548264166), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-1.19209289550780998537e-7, -1.0)), new Complex(-4.08353664972140578674e-7, -1.5574077246548264166), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(1.19209289550780998537e-7, 2.0)), new Complex(6.883620266963823194e-7, -2.18503986326133968913), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(1.19209289550780998537e-7, -2.0)), new Complex(6.883620266963823194e-7, 2.18503986326133968913), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-1.19209289550780998537e-7, 2.0)), new Complex(-6.883620266963823194e-7, -2.18503986326133968913), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-1.19209289550780998537e-7, -2.0)), new Complex(-6.883620266963823194e-7, 2.18503986326133968913), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(1.19209289550780998537e-7, 8.388608e6)), new Complex(1.46599772339822753325e-7, -4.79341238626534480166e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(1.19209289550780998537e-7, -8.388608e6)), new Complex(1.46599772339822753325e-7, 4.79341238626534480166e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-1.19209289550780998537e-7, 8.388608e6)), new Complex(-1.46599772339822753325e-7, -4.79341238626534480166e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-1.19209289550780998537e-7, -8.388608e6)), new Complex(-1.46599772339822753325e-7, 4.79341238626534480166e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(5.0e-1, 0.0)), new Complex(4.62117157260009758502e-1, 0.0), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-5.0e-1, 0.0)), new Complex(-4.62117157260009758502e-1, 0.0), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(5.0e-1, 1.19209289550780998537e-7)), new Complex(4.62117157260014923167e-1, 9.37518755156906950334e-8), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(5.0e-1, -1.19209289550780998537e-7)), new Complex(4.62117157260014923167e-1, -9.37518755156906950334e-8), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-5.0e-1, 1.19209289550780998537e-7)), new Complex(-4.62117157260014923167e-1, 9.37518755156906950334e-8), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-5.0e-1, -1.19209289550780998537e-7)), new Complex(-4.62117157260014923167e-1, -9.37518755156906950334e-8), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(5.0e-1, 5.0e-1)), new Complex(5.64083141267498498301e-1, 4.0389645531602573987e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(5.0e-1, -5.0e-1)), new Complex(5.64083141267498498301e-1, -4.0389645531602573987e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-5.0e-1, 5.0e-1)), new Complex(-5.64083141267498498301e-1, 4.0389645531602573987e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-5.0e-1, -5.0e-1)), new Complex(-5.64083141267498498301e-1, -4.0389645531602573987e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(5.0e-1, 1.0)), new Complex(1.04283072834436108334, 8.0687741216308496805e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(5.0e-1, -1.0)), new Complex(1.04283072834436108334, -8.0687741216308496805e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-5.0e-1, 1.0)), new Complex(-1.04283072834436108334, 8.0687741216308496805e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-5.0e-1, -1.0)), new Complex(-1.04283072834436108334, -8.0687741216308496805e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(5.0e-1, 2.0)), new Complex(1.32128658377119172407, -8.50878121144937689981e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(5.0e-1, -2.0)), new Complex(1.32128658377119172407, 8.50878121144937689981e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-5.0e-1, 2.0)), new Complex(-1.32128658377119172407, -8.50878121144937689981e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-5.0e-1, -2.0)), new Complex(-1.32128658377119172407, 8.50878121144937689981e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(5.0e-1, 8.388608e6)), new Complex(5.41716250417887329949e-1, -3.59344691191258128235e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(5.0e-1, -8.388608e6)), new Complex(5.41716250417887329949e-1, 3.59344691191258128235e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-5.0e-1, 8.388608e6)), new Complex(-5.41716250417887329949e-1, -3.59344691191258128235e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-5.0e-1, -8.388608e6)), new Complex(-5.41716250417887329949e-1, 3.59344691191258128235e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(1.0, 0.0)), new Complex(7.61594155955764888119e-1, 0.0), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-1.0, 0.0)), new Complex(-7.61594155955764888119e-1, 0.0), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(1.0, 1.19209289550780998537e-7)), new Complex(7.61594155955769433461e-1, 5.00648428933648718814e-8), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(1.0, -1.19209289550780998537e-7)), new Complex(7.61594155955769433461e-1, -5.00648428933648718814e-8), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-1.0, 1.19209289550780998537e-7)), new Complex(-7.61594155955769433461e-1, 5.00648428933648718814e-8), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-1.0, -1.19209289550780998537e-7)), new Complex(-7.61594155955769433461e-1, -5.00648428933648718814e-8), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(1.0, 5.0e-1)), new Complex(8.42966204845783228749e-1, 1.95577310065933999348e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(1.0, -5.0e-1)), new Complex(8.42966204845783228749e-1, -1.95577310065933999348e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-1.0, 5.0e-1)), new Complex(-8.42966204845783228749e-1, 1.95577310065933999348e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-1.0, -5.0e-1)), new Complex(-8.42966204845783228749e-1, -1.95577310065933999348e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(1.0, 1.0)), new Complex(1.08392332733869454348, 2.71752585319511716529e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(1.0, -1.0)), new Complex(1.08392332733869454348, -2.71752585319511716529e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-1.0, 1.0)), new Complex(-1.08392332733869454348, 2.71752585319511716529e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-1.0, -1.0)), new Complex(-1.08392332733869454348, -2.71752585319511716529e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(1.0, 2.0)), new Complex(1.16673625724091988181, -2.43458201185725252703e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(1.0, -2.0)), new Complex(1.16673625724091988181, 2.43458201185725252703e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-1.0, 2.0)), new Complex(-1.16673625724091988181, -2.43458201185725252703e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-1.0, -2.0)), new Complex(-1.16673625724091988181, 2.43458201185725252703e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(1.0, 8.388608e6)), new Complex(8.26442970158583129592e-1, -1.77637086921766769528e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(1.0, -8.388608e6)), new Complex(8.26442970158583129592e-1, 1.77637086921766769528e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-1.0, 8.388608e6)), new Complex(-8.26442970158583129592e-1, -1.77637086921766769528e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-1.0, -8.388608e6)), new Complex(-8.26442970158583129592e-1, 1.77637086921766769528e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(2.0, 0.0)), new Complex(9.64027580075816883946e-1, 0.0), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-2.0, 0.0)), new Complex(-9.64027580075816883946e-1, 0.0), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(2.0, 1.19209289550780998537e-7)), new Complex(9.64027580075817851838e-1, 8.42223463692232587918e-9), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(2.0, -1.19209289550780998537e-7)), new Complex(9.64027580075817851838e-1, -8.42223463692232587918e-9), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-2.0, 1.19209289550780998537e-7)), new Complex(-9.64027580075817851838e-1, 8.42223463692232587918e-9), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-2.0, -1.19209289550780998537e-7)), new Complex(-9.64027580075817851838e-1, -8.42223463692232587918e-9), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(2.0, 5.0e-1)), new Complex(9.79940849961738063073e-1, 3.02159873228775745529e-2), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(2.0, -5.0e-1)), new Complex(9.79940849961738063073e-1, -3.02159873228775745529e-2), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-2.0, 5.0e-1)), new Complex(-9.79940849961738063073e-1, 3.02159873228775745529e-2), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-2.0, -5.0e-1)), new Complex(-9.79940849961738063073e-1, -3.02159873228775745529e-2), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(2.0, 1.0)), new Complex(1.01479361614663356812, 3.38128260798966902844e-2), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(2.0, -1.0)), new Complex(1.01479361614663356812, -3.38128260798966902844e-2), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-2.0, 1.0)), new Complex(-1.01479361614663356812, 3.38128260798966902844e-2), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-2.0, -1.0)), new Complex(-1.01479361614663356812, -3.38128260798966902844e-2), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(2.0, 2.0)), new Complex(1.02383559457047268829, -2.83929528682322890117e-2), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(2.0, -2.0)), new Complex(1.02383559457047268829, 2.83929528682322890117e-2), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-2.0, 2.0)), new Complex(-1.02383559457047268829, -2.83929528682322890117e-2), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-2.0, -2.0)), new Complex(-1.02383559457047268829, 2.83929528682322890117e-2), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(2.0, 8.388608e6)), new Complex(9.76923254969577828273e-1, -2.79067860702819187579e-2), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(2.0, -8.388608e6)), new Complex(9.76923254969577828273e-1, 2.79067860702819187579e-2), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-2.0, 8.388608e6)), new Complex(-9.76923254969577828273e-1, -2.79067860702819187579e-2), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Tanh(new Complex(-2.0, -8.388608e6)), new Complex(-9.76923254969577828273e-1, 2.79067860702819187579e-2), 13);
//            TestHelper.TestLogRelativeError(ComplexMath.Tanh(new Complex(8.388608e6, 0.0)), new Complex(1.0, 0.0), 13);
//            TestHelper.TestLogRelativeError(ComplexMath.Tanh(new Complex(-8.388608e6, 0.0)), new Complex(-1.0, 0.0), 13);
//            TestHelper.TestLogRelativeError(ComplexMath.Tanh(new Complex(8.388608e6, 1.19209289550780998537e-7)), new Complex(1.0, 0.0), 13);
//            TestHelper.TestLogRelativeError(ComplexMath.Tanh(new Complex(8.388608e6, -1.19209289550780998537e-7)), new Complex(1.0, 0.0), 13);
//            TestHelper.TestLogRelativeError(ComplexMath.Tanh(new Complex(-8.388608e6, 1.19209289550780998537e-7)), new Complex(-1.0, 0.0), 13);
//            TestHelper.TestLogRelativeError(ComplexMath.Tanh(new Complex(-8.388608e6, -1.19209289550780998537e-7)), new Complex(-1.0, 0.0), 13);
//            TestHelper.TestLogRelativeError(ComplexMath.Tanh(new Complex(8.388608e6, 5.0e-1)), new Complex(1.0, -1.21442643638916640373e-64), 13);
//            TestHelper.TestLogRelativeError(ComplexMath.Tanh(new Complex(8.388608e6, -5.0e-1)), new Complex(1.0, -1.21442643638916640373e-64), 13);
//            TestHelper.TestLogRelativeError(ComplexMath.Tanh(new Complex(-8.388608e6, 5.0e-1)), new Complex(-1.0, 1.21442643638916640373e-64), 13);
//            TestHelper.TestLogRelativeError(ComplexMath.Tanh(new Complex(-8.388608e6, -5.0e-1)), new Complex(-1.0, 1.21442643638916640373e-64), 13);
//            TestHelper.TestLogRelativeError(ComplexMath.Tanh(new Complex(8.388608e6, 1.0)), new Complex(1.0, 0.0), 13);
//            TestHelper.TestLogRelativeError(ComplexMath.Tanh(new Complex(8.388608e6, -1.0)), new Complex(1.0, 0.0), 13);
//            TestHelper.TestLogRelativeError(ComplexMath.Tanh(new Complex(-8.388608e6, 1.0)), new Complex(-1.0, 0.0), 13);
//            TestHelper.TestLogRelativeError(ComplexMath.Tanh(new Complex(-8.388608e6, -1.0)), new Complex(-1.0, 0.0), 13);
//            TestHelper.TestLogRelativeError(ComplexMath.Tanh(new Complex(8.388608e6, 2.0)), new Complex(1.0, 0.0), 13);
//            TestHelper.TestLogRelativeError(ComplexMath.Tanh(new Complex(8.388608e6, -2.0)), new Complex(1.0, 0.0), 13);
//            TestHelper.TestLogRelativeError(ComplexMath.Tanh(new Complex(-8.388608e6, 2.0)), new Complex(-1.0, 0.0), 13);
//            TestHelper.TestLogRelativeError(ComplexMath.Tanh(new Complex(-8.388608e6, -2.0)), new Complex(-1.0, 0.0), 13);
//            TestHelper.TestLogRelativeError(ComplexMath.Tanh(new Complex(8.388608e6, 8.388608e6)), new Complex(1.0, 0.0), 13);
//            TestHelper.TestLogRelativeError(ComplexMath.Tanh(new Complex(8.388608e6, -8.388608e6)), new Complex(1.0, 0.0), 13);
//            TestHelper.TestLogRelativeError(ComplexMath.Tanh(new Complex(-8.388608e6, 8.388608e6)), new Complex(-1.0, 0.0), 13);
//            TestHelper.TestLogRelativeError(ComplexMath.Tanh(new Complex(-8.388608e6, -8.388608e6)), new Complex(-1.0, 0.0), 13);
        }
    }
}